#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define POTENTIOMETER_PIN 34// 使用ESP32的ADC引脚

// 根据规格书定义参数
#define SCREEN_WIDTH 128   // OLED宽度（像素）
#define SCREEN_HEIGHT 64   // OLED高度（像素）
#define OLED_ADDR 0x3C     // I2C地址（规格书第8页）
#define SDA_PIN 19         // ESP32默认SDA
#define SCL_PIN 22
const int potPinX = 35;
const int potPinY = 32;
int potXValue = 0,potYValue = 0;         // ESP32默认SCL

// 创建OLED对象
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
  Serial.begin(115200);
  
  // 初始化I2C（根据规格书第7页引脚定义）
  Wire.begin(SDA_PIN, SCL_PIN);
  
  // 初始化OLED（规格书第9-10页电气特性）
  if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
    Serial.println("OLED初始化失败!");
    while(1); // 停止执行
  }
  Serial.println("OLED初始化成功!");

  // 应用规格书第13页的初始化序列
  display.ssd1306_command(SSD1306_DISPLAYOFF);                    // 0xAE
  display.ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV);            // 0xD5
  display.ssd1306_command(0x80);                                  // 建议值
  display.ssd1306_command(SSD1306_SETMULTIPLEX);                  // 0xA8
  display.ssd1306_command(SCREEN_HEIGHT - 1);                     // 0x3F (64-1)
  display.ssd1306_command(SSD1306_SETDISPLAYOFFSET);              // 0xD3
  display.ssd1306_command(0x00);                                  // 无偏移
  display.ssd1306_command(SSD1306_SETSTARTLINE | 0x00);           // 0x40
  display.ssd1306_command(SSD1306_CHARGEPUMP);                    // 0x8D
  display.ssd1306_command(0x14);                                  // 启用电荷泵
  display.ssd1306_command(SSD1306_MEMORYMODE);                    // 0x20
  display.ssd1306_command(0x00);                                  // 水平寻址模式
  display.ssd1306_command(SSD1306_SEGREMAP | 0x01);               // 0xA1
  display.ssd1306_command(SSD1306_COMSCANDEC);                    // 0xC8
  display.ssd1306_command(SSD1306_SETCOMPINS);                    // 0xDA
  display.ssd1306_command(0x12);                                  // 引脚配置
  display.ssd1306_command(SSD1306_SETCONTRAST);                   // 0x81
  display.ssd1306_command(0xCF);                                  // 对比度值
  display.ssd1306_command(SSD1306_SETPRECHARGE);                  // 0xD9
  display.ssd1306_command(0xF1);                                  // 预充电周期
  display.ssd1306_command(SSD1306_SETVCOMDETECT);                 // 0xDB
  display.ssd1306_command(0x30);                                  // Vcomh电平
  display.ssd1306_command(SSD1306_DISPLAYALLON_RESUME);           // 0xA4
  display.ssd1306_command(SSD1306_NORMALDISPLAY);                 // 0xA6
  display.ssd1306_command(SSD1306_DISPLAYON);                     // 0xAF

}

void loop() {
  // 显示动态文本
  // 读取电位器的电压值
  int analogValue = analogRead(POTENTIOMETER_PIN);
  float voltage = analogValue * (3.3 / 4095.0);// 将ADC值转换为电压值
  // 读取电位器的值
  potXValue = analogRead(potPinX);
  potYValue = analogRead(potPinY);
  Serial.print("X=");
  Serial.println(potXValue);
  Serial.print("Y=");
  Serial.println(potYValue);

// 通过串口输出电压值
  Serial.print("Voltage: ");
  Serial.print(voltage, 2);// 保留两位小数
  Serial.print(" V (Raw: ");
  Serial.print(analogValue);
  Serial.println(")");

  display.clearDisplay();
  displayText("Power: ", 0, 10);
  display.print(voltage);
  display.println();
  displayText("X: ", 0, 30);
  display.print(potXValue);
  displayText("X: ", 0, 40);
  display.print(potYValue);
  delay(200);

}

// 显示文本（带自动换行）
void displayText(String text, int x, int y) {
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(x, y);
  display.print(text);
  display.display();


}

